home *** CD-ROM | disk | FTP | other *** search
/ Aminet 28 / Aminet 28 (1998)(GTI - Schatztruhe)[!][Dec 1998].iso / Aminet / dev / c / qtools0.2-src.lha / src / libqdisplay / draw-orig24.c < prev    next >
Encoding:
C/C++ Source or Header  |  1998-07-10  |  4.5 KB  |  170 lines

  1. #ifdef    USE_ZBUFFER
  2. #define    inc()        { u += du; v += dv; w += dw; }
  3. #define    fill(pel, z) { *pBuffer++ = (pel); *zBuffer++ = (unsigned short int)(z); }
  4. #else
  5. #define    inc()        { u += du; v += dv; }
  6. #define    fill(pel, z) { *pBuffer++ = (pel); }
  7. #endif
  8.  
  9. #ifdef    USE_ZBUFFER
  10. struct rgb *draw_affine24(int n, struct rgb *pBuffer, unsigned short int *zBuffer, int u, int v, int w, int du, int dv, int dw)
  11. #else
  12. struct rgb *draw_affine24(int n, struct rgb *pBuffer, int u, int v, int du, int dv)
  13. #endif
  14. {
  15.   if (textureType == WALL_TYPE) {
  16.     while (n--) {
  17.       int iu = u >> 16;
  18.       int iv = ((v >> (16 - MAX_LOGY)) & MAX_MASKX) + textureRow;
  19.  
  20. #ifdef CALCULATE_PIXELDRAW
  21.       pixelDraw++;
  22.       if (*pBuffer)
  23.     pixelOverdraw++;
  24. #endif
  25.  
  26.       fill(texture.truecolor[multMuls[iv] + iu], w);
  27.       inc();
  28.     }
  29.   }
  30.   else if (textureType == SKY_TYPE) {
  31.     /* TODO: skies */
  32.     while (n--) {
  33.       int iu;
  34.       int iv;
  35.       struct rgb pel, sum;
  36.  
  37. #ifdef CALCULATE_PIXELDRAW
  38.       pixelDraw++;
  39.       if (*pBuffer)
  40.     pixelOverdraw++;
  41. #endif
  42.  
  43.       iu = ((u >> 8) + skyMovementX1) & 0x00007F00;
  44.       iv = ((v >> 16) + skyMovementY1) & 0x0000007F;
  45.       sum = texture.truecolor[iu + iv + 0x80];
  46.       iu = ((u >> 8) + skyMovementX2) & 0x00007F00;
  47.       iv = ((v >> 16) + skyMovementY2) & 0x0000007F;
  48.       pel = texture.truecolor[iu + iv];
  49.       if ((!pel.r) && (!pel.g) && (!pel.b))
  50.     sum = pel;
  51.  
  52.       fill(sum, 0xFFFF);
  53.       inc();
  54.     }
  55.   }
  56.   else {
  57.     while (n--) {
  58. #ifndef    FAST_WARP
  59.       int iv = ((v + (swim_v[((u >> textureShift2) & 0xff)] >> textureMip)) >> 16) & textureMask2;
  60.       int iu = ((u + (swim_u[((v >> textureShift2) & 0xff)] >> textureMip)) >> textureShift1) & textureMask1;
  61. #else
  62.       int iv = ((v + swim_v[(u >> 16)]) >> 16) & textureMask2;
  63.       int iu = ((u + swim_u[(v >> 16)]) >> textureShift1) & textureMask1;
  64. #endif
  65.  
  66.       fill(texture.truecolor[iu + iv], w);
  67.       inc();
  68.     }
  69.   }
  70.   return pBuffer;
  71. }
  72.  
  73. /* given a span (x0,y)..(x1,y), draw a perspective-correct span for it */
  74. /*
  75.  * the zbuffer is interesting for dynamic model-draw etc.
  76.  * the buffers values (1/z) are all under 0, we can try to
  77.  * store them as 16bit-wide-fraction
  78.  *
  79.  * while(n--) {
  80.  *   *zbuf++ = (unsigned short int)(w); / we need only the lower part /
  81.  *   w += dw;
  82.  * }
  83.  *
  84.  */
  85. void draw_span24(int y, int sx, int ex)
  86. {
  87.   float w0, w1;
  88.   float v0, v1;
  89.   float u0, u1;
  90.  
  91. #ifdef    USE_ZBUFFER
  92.   int w, dw;                            /* 1/zbuffer */
  93. #endif
  94.   int v, dv;
  95.   int u, du;
  96.   int slen, rlen, len, end;
  97.  
  98.   struct rgb *pBuffer = (struct rgb *)localDim.frameBuffer + multRows[y] + sx;
  99.  
  100. #ifdef    USE_ZBUFFER
  101.   unsigned short int *zBuffer = localDim.zBuffer + multRows[y] + sx;
  102. #endif
  103.   float prew = tmap[6] + y * tmap[8];
  104.   float prev = tmap[3] + y * tmap[5];
  105.   float preu = tmap[0] + y * tmap[2];
  106.  
  107.   /* compute (u,v) at left end */
  108.   w0 = 1 / (prew + sx * tmap[7]);                /* 1/zbuffer */
  109.   v0 = (prev + sx * tmap[4]) * w0;
  110.   u0 = (preu + sx * tmap[1]) * w0;
  111.  
  112.   len = ex - sx;
  113.   for (slen = len >> SUBDIV_SHIFT; slen > 0; slen--) {
  114. #ifdef    USE_ZBUFFER
  115.     w = FLOAT_TO_FIX(w0);                    /* 1/zbuffer */
  116. #endif
  117.     v = FLOAT_TO_FIX(v0);
  118.     u = FLOAT_TO_FIX(u0);
  119.  
  120.     end = sx + SUBDIV;
  121.     w1 = 1 / (prew + end * tmap[7]);
  122.     v1 = (prev + end * tmap[4]) * w1;
  123.     u1 = (preu + end * tmap[1]) * w1;
  124.  
  125. #ifdef    USE_ZBUFFER
  126.     dw = (FLOAT_TO_FIX(v1) - w) >> SUBDIV_SHIFT;        /* 1/zbuffer */
  127. #endif
  128.     dv = (FLOAT_TO_FIX(v1) - v) >> SUBDIV_SHIFT;
  129.     du = (FLOAT_TO_FIX(u1) - u) >> SUBDIV_SHIFT;
  130.  
  131. #ifdef    USE_ZBUFFER
  132.     pBuffer = draw_affine24(SUBDIV, pBuffer, zBuffer, u, v, w, du, dv, dw);
  133.     zBuffer += SUBDIV;
  134. #else
  135.     pBuffer = draw_affine24(SUBDIV, pBuffer, u, v, du, dv);
  136. #endif
  137.     sx = end;
  138.  
  139. #ifdef    USE_ZBUFFER
  140.     w0 = w1;                            /* 1/zbuffer */
  141. #endif
  142.     v0 = v1;
  143.     u0 = u1;
  144.   }
  145.  
  146. #ifdef    USE_ZBUFFER
  147.   w = FLOAT_TO_FIX(w0);                        /* 1/zbuffer */
  148. #endif
  149.   v = FLOAT_TO_FIX(v0);
  150.   u = FLOAT_TO_FIX(u0);
  151.   if ((rlen = (len & SUBDIV_MASK) - 1)) {            /* a) do not calc if only draw 1 pixel */
  152.     end = sx + rlen;
  153.     w1 = 1 / (prew + end * tmap[7]);
  154.     v1 = (prev + end * tmap[4]) * w1;
  155.     u1 = (preu + end * tmap[1]) * w1;
  156.  
  157. #ifdef    USE_ZBUFFER
  158.     dw = FLOAT_TO_FIX((w1 - w0) / rlen);            /* 1/zbuffer */
  159. #endif
  160.     dv = FLOAT_TO_FIX((v1 - v0) / rlen);
  161.     du = FLOAT_TO_FIX((u1 - u0) / rlen);
  162.   }
  163.   /* a) but draw that pixel surely */
  164. #ifdef    USE_ZBUFFER
  165.   draw_affine24(rlen + 1, pBuffer, zBuffer, u, v, w, du, dv, dw);    /* for the last pixel the du and dv are thrown away */
  166. #else
  167.   draw_affine24(rlen + 1, pBuffer, u, v, du, dv);        /* for the last pixel the du and dv are thrown away */
  168. #endif
  169. }
  170.